package org.example.Result;

/**
 * 数据返回工具类
 **/
public class ResultUtils {


    /**
     * 静态方法便于快速创建成功和失败的响应
     * 返回带参数(成功)
     *
     * @param data 返回成功数据
     * @return Result<T> 对象，包含编码、消息、数据和状态码
     */
    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>();
        result.setSuccess(true);
        result.setData(data);
        result.setCode(StatusCode.SUCCESS_CODE);
        result.setMessage("操作成功");
        return result;
    }
    /**
     * 静态方法便于快速创建成功和失败的响应
     * 返回带参数(成功)
     *
     * @param message  返回的消息
     * @param data 返回成功数据
     * @return Result<T> 对象，包含编码、消息、数据和状态码
     */
    public static <T> Result<T> success(String message, T data) {
        Result<T> result = new Result<>();
        result.setSuccess(true);
        result.setData(data);
        result.setCode(StatusCode.SUCCESS_CODE);
        result.setMessage(message);
        return result;
    }

    /**
     * 设置 状态码并返回(错误返回)
     * @param message  返回的消息
     * @return 返回 状态码为请求参数无效
     */
    public static <T> Result<T> failure(String message) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(StatusCode.BAD_REQUEST);
        result.setMessage(message);
        return result;
    }
    /**
     * 设置 状态码并返回(错误返回)
     * @param message  返回的消息
     * @return 返回 状态码为缺少参数
     */
    public static <T> Result<T> missingParameter(String message) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(StatusCode.MISSING_PARAMETER);
        result.setMessage(message);
        return result;
    }

    /**
     * 设置 状态码并返回(错误返回)
     * @param message  返回的消息
     * @return 返回 状态码为 失败 缺少或无效的 API 密钥
     */
    public static <T> Result<T> unauthorized(String message) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(StatusCode.UNAUTHORIZED);
        result.setMessage(message);
        return result;
    }
    /**
     * 设置 状态码并返回(错误返回)
     * @param message  返回的消息
     * @return 返回 状态码为 未知或未找到指定的资源
     */
    public static <T> Result<T> uncertain(String message) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(StatusCode.NOT_FOUND);
        result.setMessage(message);
        return result;
    }
    /**
     * 设置 状态码并返回(错误返回)
     * @param message  返回的消息
     * @return 返回 状态码为 错误 服务器内部错误
     */
    public static <T> Result<T> error(String message) {
        Result<T> result = new Result<>();
        result.setSuccess(false);
        result.setCode(StatusCode.ERROR_CODE);
        result.setMessage(message);
        return result;
    }
    /**
     * 复制 Result对象到ResultVo对象
     * @param result Result对象
     * @return ResultVo对象
     * */
    public static <T> ResultVo<T> copyProperties(Result<T> result) {
        ResultVo<T> objectResultVo = new ResultVo<>();
        objectResultVo.setCode(result.getCode().getCode());
        objectResultVo.setData(result.getData());
        objectResultVo.setMsg(result.getMessage());
        return  objectResultVo;
    }

}
